//package com.smrtcold.dev.plc;
//
//import org.eclipse.milo.opcua.sdk.client.OpcUaClient;
//import org.eclipse.milo.opcua.sdk.client.api.identity.AnonymousProvider;
//import org.eclipse.milo.opcua.stack.core.UaException;
//import org.eclipse.milo.opcua.stack.core.security.SecurityPolicy;
//import org.eclipse.milo.opcua.stack.core.types.builtin.DataValue;
//import org.eclipse.milo.opcua.stack.core.types.builtin.NodeId;
//import org.eclipse.milo.opcua.stack.core.types.builtin.unsigned.UInteger;
//import org.eclipse.milo.opcua.stack.core.types.enumerated.TimestampsToReturn;
//import org.eclipse.milo.opcua.stack.core.types.structured.EndpointDescription;
//
//import java.util.concurrent.ExecutionException;
//
//public class KepServerUAClient2 {
//    public static void main(String[] args) {
//        String endpointUrl = "opc.tcp://127.0.0.1:49320";
//
//        System.out.println("启动OPC UA客户端...");
//        System.out.println("连接目标: " + endpointUrl);
//
//        try  {
//            OpcUaClient client = createClient(endpointUrl);
//            System.out.println("正在连接服务器...");
//            client.connect().get();
//            System.out.println("连接成功!");
//
//            // 测试读取服务器状态
//            readTagValue(client, "ns=0;i=2259"); // Server状态
//
//            // 测试读取服务器时间
//            readTagValue(client, "ns=0;i=2258"); // 服务器当前时间
//
//            // 读取自定义标签
//            readTagValue(client, "ns=2;s=Channel1.Device1.Tag1");
//
//        } catch (UaException | InterruptedException | ExecutionException e) {
//            System.err.println("连接失败: " + e.getMessage());
//            e.printStackTrace();
//        }
//    }
//
//    private static OpcUaClient createClient(String endpointUrl) throws UaException {
//        return OpcUaClient.create(
//                endpointUrl,
//                endpoints -> {
//                    System.out.println("\n发现端点:");
//                    endpoints.forEach(e ->
//                            System.out.printf(" - %-25s %s%n",
//                                    e.getSecurityPolicyUri(),
//                                    e.getSecurityMode())
//                    );
//
//                    // 优先选择None安全策略
//                    for (EndpointDescription e : endpoints) {
//                        if (SecurityPolicy.None.getUri().equals(e.getSecurityPolicyUri())) {
//                            System.out.println("选择端点: " + e.getEndpointUrl());
//                            return java.util.Optional.of(e);
//                        }
//                    }
//
//                    // 其次选择Basic256Sha256
//                    for (EndpointDescription e : endpoints) {
//                        if (SecurityPolicy.Basic256Sha256.getUri().equals(e.getSecurityPolicyUri())) {
//                            System.out.println("选择端点: " + e.getEndpointUrl());
//                            return java.util.Optional.of(e);
//                        }
//                    }
//
//                    // 默认选择第一个端点
//                    System.out.println("默认选择端点: " + endpoints.get(0).getEndpointUrl());
//                    return java.util.Optional.ofNullable(endpoints.get(0));
//                },
//                configBuilder -> configBuilder
//                        .setIdentityProvider(new AnonymousProvider())
//                        .setRequestTimeout(UInteger.valueOf(15000))
////                        .setCertificateValidator(certificateValidator -> {
////                            // 信任所有证书（仅用于测试环境！）
////                            return CompletableFuture.completedFuture(true);
////                        })
////                        .setConnectTimeout(Duration.ofSeconds(10))
//                        .build()
//        );
//    }
//
//    private static void readTagValue(OpcUaClient client, String nodeIdString) {
//        try {
//            NodeId nodeId = NodeId.parse(nodeIdString);
//            DataValue dataValue = client.readValue(0, TimestampsToReturn.Both, nodeId).get();
//            System.out.printf("\n标签 [%s]%n值: %s%n质量: %s%n时间戳: %s%n",
//                    nodeIdString,
//                    dataValue.getValue().getValue(),
//                    dataValue.getStatusCode(),
//                    dataValue.getSourceTime());
//        } catch (Exception e) {
//            System.err.println("\n读取标签失败: " + nodeIdString);
//            System.err.println("错误: " + e.getMessage());
//        }
//    }
//}
